package sim_moteur;

/**
 * Classe qui représente la position d'un élément sur le Terrain
 * 
 * @author Martin Simoneau
 *
 */
public class Coordonnee {
	public final static int NOMBRE_DE_DIRECTION = 8;

	private int x;
	private int y;

	public Coordonnee(int x, int y) {
		// -1 pour un objet retiré du terrain
		if (x >= -1 && y >= -1) {
			this.x = x;
			this.y = y;
		}
	}

	/**
	 * Constructeur par recopie
	 * 
	 * @param coordonnee
	 *            la coordonnée à copier
	 */
	public Coordonnee(Coordonnee coordonnee) {
		this.x = coordonnee.x;
		this.y = coordonnee.y;
	}

	public int getX() {
		return x;
	}

	/**
	 * Ajuste la valeur de x si la valeur reçue est supérieure à 0.
	 * 
	 * @param x
	 *            la position X
	 */
	public void setX(int x) {
		if (x > 0)
			this.x = x;
	}

	public int getY() {
		return y;
	}

	/**
	 * Ajuste la valeur de y si la valeur reçue est supérieure à 0.
	 * 
	 * @param y
	 *            la position y.
	 */
	public void setY(int y) {
		if (y > 0)
			this.y = y;
	}

	/**
	 * Incrémente la coordonnées x par la valeur deltaX reçue en paramètre
	 * 
	 * @param deltaX
	 *            la valeur de l'incrément à ajouter à x.
	 */
	public void ajouteX(int deltaX) {
		x += deltaX;
	}

	/**
	 * Incrémente la coordonnées y par la valeur deltaY reçue en paramètre
	 * 
	 * @param deltYX
	 *            la valeur de l'incrément à ajouter à y.
	 */
	public void ajouteY(int deltaY) {
		y += deltaY;
	}

	/**
	 * Déplace la coordonnée selon la position reçue 0->haut-gauche, 1->haut,
	 * 2->haut-droit, 3->gauche, 4->droit, 5->bas-gauche, 6->bas, 7->bas-droit,
	 * 
	 * @param direction
	 *            la direction souhaitée
	 * @return une nouvelle coordonnée située à côté dans la direction
	 *         souhaitée.
	 */
	public Coordonnee retourneACote(int direction) {
		Coordonnee coordonnee = new Coordonnee(this);

		if (direction >= 0 && direction <= 8) {
			int deltaX = 0;
			int deltaY = 0;
			switch (direction) {
			case 0: // NO
			case 1: // N
			case 2: // NE
				deltaY += 1;
				break;
			case 5: // SO
			case 6: // S
			case 7: // SE
				deltaY -= 1;
			}

			switch (direction) {
			case 0: // NO
			case 3: // O
			case 5: // SO
				deltaX -= 1;
				break;
			case 2: // NE
			case 4: // E
			case 7: // SE
				deltaX += 1;
			}
			coordonnee.ajouteX(deltaX);
			coordonnee.ajouteY(deltaY);
		}

		return coordonnee;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + x;
		result = prime * result + y;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Coordonnee other = (Coordonnee) obj;
		if (x != other.x)
			return false;
		if (y != other.y)
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "(" + x + ", " + y + ")";
	}

}
